
/*
 * Hlpay-Plus aggregate payment system. Copyright
 * (c) 2022-2023 Hlpay Team Copyright has the right of final interpretation.
 */

package com.hlkj.pay.util;

import com.hlkj.framework.common.util.json.JsonUtils;
import com.hlkj.pay.common.constants.BaseConstants;
import com.hlkj.pay.dto.ad.AdStatisticsTimeKeyDto;
import org.springframework.util.CollectionUtils;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * @author Bob
 * @description 入参工具类
 * @date 2024/09/14
 */
public class AdUtils {

    public static List<String> prefixes = new ArrayList<>();

    public static String phone() {
        if (CollectionUtils.isEmpty(prefixes)) {
            initPrefixes();
        }

        // 随机选择一个号段
        Random random = new Random();
        String prefix = prefixes.get(random.nextInt(prefixes.size()));

        // 生成剩余的八位随机数字
        int suffix = (random.nextInt(9) + 1) * 1000 + random.nextInt(1000);
        return prefix + "****" + suffix;
    }

    /**
     * 获取给定时间戳所在的分钟级别时间范围。
     *
     * @param timestamp 时间戳（毫秒）
     * @param intervalMinutes 分钟级别的间隔（分钟）
     * @return 时间级别的开始时间和结束时间的字符串表示
     */
    public static AdStatisticsTimeKeyDto getMinuteLevelTimeRange(long timestamp, int intervalMinutes,ZoneId zoneId) {
        if(zoneId==null){
            zoneId=ZoneId.of(BaseConstants.shanghaiTimeZoneId);
        }
        LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), zoneId);
        int totalMinutesSinceMidnight = dateTime.getHour() * 60 + dateTime.getMinute();
        
        // 计算开始时间
        int startMinute = totalMinutesSinceMidnight - (totalMinutesSinceMidnight % intervalMinutes);
        int startHour = startMinute / 60;
        int startMinuteOfHour = startMinute % 60;
        LocalDateTime startTime = dateTime.withHour(startHour).withMinute(startMinuteOfHour).withSecond(0).withNano(0);
        long startTimeMillis = startTime.atZone(zoneId).toInstant().toEpochMilli();
        
        // 计算结束时间
        int endMinute = startMinute + intervalMinutes;
        LocalDateTime endTime = startTime.plusMinutes(intervalMinutes).minusNanos(1);
        long endTimeMillis = endTime.atZone(zoneId).toInstant().toEpochMilli();
        
        // 格式化时间段
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        DateTimeFormatter endFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
        String key = startTime.format(formatter) + "-" + endTime.format(endFormatter);
        
        AdStatisticsTimeKeyDto adStatisticsTimeKeyDto = new AdStatisticsTimeKeyDto();
        adStatisticsTimeKeyDto.setTimeKey(key);
        adStatisticsTimeKeyDto.setStartTime(startTimeMillis);
        adStatisticsTimeKeyDto.setEndTime(endTimeMillis);
        return adStatisticsTimeKeyDto;
    }

    public static void main(String[] args) {
        long timestamp = System.currentTimeMillis(); // 获取当前时间戳
        int intervalMinutes = 2; // 定义分钟级别的间隔

        // AdStatisticsTimeKeyDto minuteRange = getMinuteLevelTimeRange(timestamp, intervalMinutes, ZoneId.of("Asia/Shanghai"));
        // System.out.println("时间戳对应的分钟级别: " + JsonUtils.toJsonString(minuteRange));

        // 假设当前时间为2024-10-24T01:03:00Z
        long specificTimestamp = LocalDateTime.of(2024, 5, 24, 9, 3).atZone(ZoneId.of("Asia/Shanghai")).toInstant().toEpochMilli();
        AdStatisticsTimeKeyDto specificMinuteRange = getMinuteLevelTimeRange(1730195700001l, 5, ZoneId.of("Asia/Shanghai"));
        System.out.println("特定时间戳对应的分钟级别: " + JsonUtils.toJsonString(specificMinuteRange));
        specificMinuteRange = getMinuteLevelTimeRange(1730195700001l, 60*24, ZoneId.of("Asia/Shanghai"));
        System.out.println("特定时间戳对应的分钟级别: " + JsonUtils.toJsonString(specificMinuteRange));
    }

    public static void initPrefixes() {
        // 中国移动号段
        prefixes.add("134");
        prefixes.add("135");
        prefixes.add("136");
        prefixes.add("137");
        prefixes.add("138");
        prefixes.add("139");
        prefixes.add("147");
        prefixes.add("150");
        prefixes.add("151");
        prefixes.add("152");
        prefixes.add("157");
        prefixes.add("158");
        prefixes.add("159");
        prefixes.add("172");
        prefixes.add("178");
        prefixes.add("182");
        prefixes.add("183");
        prefixes.add("184");
        prefixes.add("187");
        prefixes.add("188");
        prefixes.add("198");

        // 中国联通号段
        prefixes.add("130");
        prefixes.add("131");
        prefixes.add("132");
        prefixes.add("155");
        prefixes.add("156");
        prefixes.add("171");
        prefixes.add("175");
        prefixes.add("176");
        prefixes.add("185");
        prefixes.add("186");
        prefixes.add("166");
        prefixes.add("167");

        // 中国电信号段
        prefixes.add("133");
        prefixes.add("153");
        prefixes.add("173");
        prefixes.add("177");
        prefixes.add("180");
        prefixes.add("181");
        prefixes.add("189");
        prefixes.add("199");
    }

}
